package com.mfn.sportjava.constants;

import com.mfn.sportjava.model.dto.MatchDTO;
import com.mfn.sportjava.model.enums.AnalysisStyle;
import java.util.Objects;

/**
 * @author Anyang
 * @version 1.0.3
 * @description 提示词工程，系统提示直接来自AnalysisStyle的roleDescription
 * @date 2025/05/12
 */
public class MessageBuilder {
    public static final String NEW_LINE = System.lineSeparator();
    public static final String USER_PROMPT_TEMPLATE = """
        %s
        请为%s联赛%s %s的%s比赛撰写赛事前瞻，请严格按照下面的Markdown模板格式输出：
        """ + NEW_LINE +
            "### [%s]%s %s %s" + NEW_LINE +
            "**盘口与赔率:**" + NEW_LINE +
            "- **亚盘:** [请根据实际情况填写，例如：主队 0.95 让 0.5球 客队 0.90]" + NEW_LINE +
            "- **欧赔:** [请根据实际情况填写，例如：胜 2.10 / 平 3.30 / 负 3.50]" + NEW_LINE +
            "- **大小球:** [请根据实际情况填写，例如：大球 0.90 盘口 2.5 小球 0.95]" + NEW_LINE +
            "**核心分析维度:**" + NEW_LINE +
            "- **近期状态对比:**" + NEW_LINE +
            "  - 主队近10场战绩：[胜/平/负、总进球/总失球]" + NEW_LINE +
            "  - 客队近10场战绩：[胜/平/负、总进球/总失球]" + NEW_LINE +
            "  - 近期攻防数据：[主队场均进球、失球、零封率；客队场均进球、失球、零封率]" + NEW_LINE +
            "- **历史交锋记录:**" + NEW_LINE +
            "  - 过去 [N] 次交手结果：[列出具体 时间 比分]" + NEW_LINE +
            "  - 历史交锋胜负倾向：[例如：主队 X胜 Y平 Z负，略占优势/明显劣势/均势]" + NEW_LINE +
            "- **关键球员对比:**" + NEW_LINE +
            "  - 主队核心球员：[球员名 (位置) - 近期状态，如进球/助攻/伤病情况]" + NEW_LINE +
            "  - 客队核心球员：[球员名 (位置) - 近期状态，如进球/助攻/伤病情况]" + NEW_LINE +
            "  - 关键对位分析：[例如：主队王牌射手 vs 客队主力中卫]" + NEW_LINE +
            "- **战术风格分析:**" + NEW_LINE +
            "  - 主队常用阵型与打法：[例如：4-3-3，倾向控球，边路传中为主]" + NEW_LINE +
            "  - 客队常用阵型与打法：[例如：4-4-2，擅长防守反击，中场拦截硬朗]" + NEW_LINE +
            "  - 可能的战术克制关系：[例如：主队高位逼抢可能限制客队后场出球]" + NEW_LINE +
            "**胜负预测:**" + NEW_LINE +
            "- 概率分布预估：[例如：主胜 45%% / 平局 30%% / 客胜 25%% (结合基本面和赔率分析)]" + NEW_LINE +
            "- 预测逻辑：[简述支持该预测的关键因素，如状态、交锋、伤病、盘赔指数等]" + NEW_LINE +
            "**比分预测:**" + NEW_LINE +
            "- 最可能比分：[例如：2-1, 1-1]" + NEW_LINE +
            "- 备选比分（含高风险）：[例如：3-1, 0-0]" + NEW_LINE +
            "- 预测逻辑：[结合球队攻防能力、近期进球模式、大小球盘口等]" + NEW_LINE +
            "**冷门与风险提示:**" + NEW_LINE +
            "- 潜在冷门因素：[例如：主队一周双赛体能堪忧、客队新帅上任或核心复出]" + NEW_LINE +
            "- 投注风险提示：[例如：亚盘过深谨防主队赢球输盘、平赔低企需防范平局]" + NEW_LINE +
            "**投注建议参考:**" + NEW_LINE +
            "- 亚盘方向：[例如：看好主队-0.5 / 建议规避]" + NEW_LINE +
            "- 大小球方向：[例如：倾向大球 2.5 / 小球更稳妥]" + NEW_LINE +
            "- 其他价值选项：[例如：平局值得关注 / 客队不败有潜力]" + NEW_LINE +
            "**总结:**" + NEW_LINE +
            "[对整场比赛进行简要概括和最终观点陈述]";

    /**
     * 获取指定分析风格的系统提示。
     * @param style 分析风格。
     * @return 完整的系统提示字符串，即角色和任务描述。
     */
    public static String getSystemPromptWithStyle(AnalysisStyle style) {
        Objects.requireNonNull(style, "Analysis style cannot be null");
        return style.getRoleDescription(); // 直接返回枚举中定义的完整描述
    }

    /**
     * 构建最终的用户提示，包含比赛详情和可选的知识库上下文。
     * @param match   比赛详情。
     * @param context 从知识库中检索到的可选上下文。
     * @return 格式化的用户提示字符串。
     */
    public static String buildUserPrompt(MatchDTO match, String context) {
        String contextSection = (context != null && !context.isBlank())
                ? String.format("【背景知识参考】\n%s\n", context.trim())
                : "【背景知识参考】\n无可用背景知识。\n";

        return String.format(USER_PROMPT_TEMPLATE,
                contextSection,
                match.getLeague(),
                match.getMatch(),
                match.getDate(),
                match.getTime(),
                // Markdown标题部分
                match.getLeague(),
                match.getMatch(),
                match.getDate(),
                match.getTime()
        );
    }
}
